package com.zenithmind.chat.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.chat.pojo.entity.ChatGroupMember;
import com.zenithmind.chat.pojo.vo.ChatUserVO;
import com.zenithmind.common.result.PageResult;

import java.util.List;

/**
 * 群组成员服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface ChatGroupMemberService extends IService<ChatGroupMember> {

    /**
     * 分页查询群组成员列表
     * 
     * @param groupId 群组ID
     * @param status 成员状态
     * @param role 成员角色
     * @param keyword 搜索关键词
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 成员列表
     */
    PageResult<ChatUserVO> getGroupMemberPage(String groupId, Integer status, Integer role, String keyword,
                                             Integer pageNum, Integer pageSize);

    /**
     * 查询群组成员列表
     * 
     * @param groupId 群组ID
     * @param status 成员状态
     * @return 成员列表
     */
    List<ChatUserVO> getGroupMembers(String groupId, Integer status);

    /**
     * 查询群组管理员列表
     * 
     * @param groupId 群组ID
     * @return 管理员列表
     */
    List<ChatUserVO> getGroupAdmins(String groupId);

    /**
     * 查询用户在群组中的信息
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 成员信息
     */
    ChatUserVO getGroupMemberInfo(String groupId, String userId);

    /**
     * 添加群组成员
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param role 成员角色
     * @param operatorId 操作人ID
     * @return 添加结果
     */
    Boolean addGroupMember(String groupId, String userId, Integer role, String operatorId);

    /**
     * 批量添加群组成员
     * 
     * @param groupId 群组ID
     * @param userIds 用户ID列表
     * @param operatorId 操作人ID
     * @return 添加结果
     */
    Boolean batchAddGroupMembers(String groupId, List<String> userIds, String operatorId);

    /**
     * 移除群组成员
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param operatorId 操作人ID
     * @return 移除结果
     */
    Boolean removeGroupMember(String groupId, String userId, String operatorId);

    /**
     * 批量移除群组成员
     * 
     * @param groupId 群组ID
     * @param userIds 用户ID列表
     * @param operatorId 操作人ID
     * @return 移除结果
     */
    Boolean batchRemoveGroupMembers(String groupId, List<String> userIds, String operatorId);

    /**
     * 设置成员角色
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param role 新角色
     * @param operatorId 操作人ID
     * @return 设置结果
     */
    Boolean setMemberRole(String groupId, String userId, Integer role, String operatorId);

    /**
     * 批量设置成员角色
     * 
     * @param groupId 群组ID
     * @param userIds 用户ID列表
     * @param role 新角色
     * @param operatorId 操作人ID
     * @return 设置结果
     */
    Boolean batchSetMemberRole(String groupId, List<String> userIds, Integer role, String operatorId);

    /**
     * 禁言成员
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param muteMinutes 禁言分钟数
     * @param operatorId 操作人ID
     * @return 禁言结果
     */
    Boolean muteMember(String groupId, String userId, Integer muteMinutes, String operatorId);

    /**
     * 解除禁言
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param operatorId 操作人ID
     * @return 解除结果
     */
    Boolean unmuteMember(String groupId, String userId, String operatorId);

    /**
     * 批量禁言成员
     * 
     * @param groupId 群组ID
     * @param userIds 用户ID列表
     * @param muteMinutes 禁言分钟数
     * @param operatorId 操作人ID
     * @return 禁言结果
     */
    Boolean batchMuteMembers(String groupId, List<String> userIds, Integer muteMinutes, String operatorId);

    /**
     * 转让群主
     * 
     * @param groupId 群组ID
     * @param newOwnerId 新群主ID
     * @param currentOwnerId 当前群主ID
     * @return 转让结果
     */
    Boolean transferOwnership(String groupId, String newOwnerId, String currentOwnerId);

    /**
     * 检查用户是否为群组成员
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 是否为成员
     */
    Boolean checkIsMember(String groupId, String userId);

    /**
     * 检查用户是否为群组管理员
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 是否为管理员
     */
    Boolean checkIsAdmin(String groupId, String userId);

    /**
     * 检查用户权限
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param requiredRole 所需角色
     * @return 是否有权限
     */
    Boolean checkUserPermission(String groupId, String userId, Integer requiredRole);

    /**
     * 统计群组成员数量
     * 
     * @param groupId 群组ID
     * @param status 成员状态
     * @return 成员数量
     */
    Integer countGroupMembers(String groupId, Integer status);

    /**
     * 更新成员最后活跃时间
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 更新结果
     */
    Boolean updateLastActiveTime(String groupId, String userId);

    /**
     * 查询即将过期的禁言成员
     * 
     * @return 成员列表
     */
    List<ChatGroupMember> getExpiredMutedMembers();

    /**
     * 自动解除过期禁言
     * 
     * @return 解除数量
     */
    Integer autoUnmuteExpiredMembers();
}
